
// //定义装饰器函数
// const watch: ClassDecorator = (target: Function) => {
//   target.prototype.getparms = <T>(parms: T): T => {
//     return parms
//   }
// }
// @watch
// //定义一个类
// class A {
//   constructor() { }
// }
// //验证
// const aa = new A()
// console.log((a as any).getparms('123'));

//装饰器工厂
// const watcher = (name: string): ClassDecorator => {
//   return (target: Function) => {
//     target.prototype.getParms = <T>(parms: T): T => {
//       return parms
//     }
//     target.prototype.getName = () => {
//       return name
//     }
//   }
// }
// @watcher('你好')
// class A {
//   constructor() {

//   }
// }
// let arg = new A()
// console.log((arg as any).getParms('456'));
// console.log((arg as any).getName());

//装饰器组合
const watcher = (name: string): ClassDecorator => {
  return (target: Function) => {
    target.prototype.getParams = <T>(params: T): T => {
      return params
    }
    target.prototype.getOptions = (): string => {
      return name
    }
  }
}
const watcher2 = (name: string): ClassDecorator => {
  return (target: Function) => {
    target.prototype.getNames = (): string => {
      return name
    }
  }
}

@watcher2('name2')
@watcher('name')
class A {
  constructor() {

  }
}
const aa = new A();
console.log((aa as any).getOptions());
console.log((aa as any).getNames());

//方法装饰器
// 返回三个参数
// 1.对于静态成员来说是类的构造函数，对于实例对象来说是类的原型对象
//2.成员的名字
// 3.成员的属性描述符
// [
//   {},
//   'setParasm',
//   {
//     value: [Function: setParasm],
//     writable: true,
//     enumerable: false,
//     configurable: true
//   }
// ]
// const met: MethodDecorator = (...args) => {
//   console.log(args);
// }

// class A {
//   constructor() {
//   }
//   @met
//   getName(): string {
//     return '小满'
//   }
// }


// const a = new A();
// //属性装饰器
// // 返回两个参数
// const met: PropertyDecorator = (...args) => {
//   console.log(args);
// }

// class A {
//   @met
//   name: string
//   constructor() {
//   }
// }


// const a = new A();

// //参数装饰器
// //返回三个参数
// const met: ParameterDecorator = (...args) => {
//   console.log(args);
// }

// class A {
//   constructor() {

//   }
//   setParasm(@met name: string = '213') {

//   }
// }


// const a = new A();